﻿
#ifndef _CORE_HEAD_H_
#define _CORE_HEAD_H_

#include "cocos2d.h"
using namespace cocos2d;

#include <string>

#define INVALID_CHANNEL_NO -1	// 无效的通道号
#define INVALID_MAIN_CODE  -1	// 无效的主码
#define INVALID_SUB_CODE   -1	// 无效的辅助码

#pragma pack(push,1)

// 动作类型
#define ACTION_NONE					0
#define ACTION_REQUEST_KEY			1
#define ACTION_TRANSFER_KEY			2
#define ACTION_USING_KEY			3

// 包体加密类型
#define ENCRYPT_TYPE_NONE			0
#define ENCRYPT_TYPE_ELGAMAL		1
#define ENCRYPT_TYPE_RSA			2
#define ENCRYPT_TYPE_ECC			3
#define ENCRYPT_TYPE_BLOWFISH		4
#define ENCRYPT_TYPE_DES_SINGLE		5
#define ENCRYPT_TYPE_DES_DOUBLE		6
#define ENCRYPT_TYPE_DES_TRIPLE		7
#define ENCRYPT_TYPE_AES			8

struct CORE_ENCRYPTION
{
	unsigned char		_packAction;		// 包行为packet action
	unsigned char		_encryptType;		// 加密方式encrypt type
	unsigned char		_randomSlot;		// 随机种子slot=random seed
	unsigned int		_originLen;			// 原始长度origin length
	unsigned int		_crcCheck;			// 校验1crc32=crc32(ciphertext+slot+type+action)
	unsigned char		_checkSum;			// 校验2checksum=sum(crc32+originLen+slot+type+action)%C
	unsigned char		_reserveData[4];	// 保留字unused
};

// 内核消息的头
struct CORE_MSG_HEAD	
{
	long long 			_beginFlag;			// 标志位，每个字节都应该是 0xaa ,其值应该是 0xaaaaaaaaaaaaaaaa  ;
	int						_cordState;			// 内核指令的状态，是掩码，第0位是 0 表示非心跳包，1 表示心跳包
	int						_totalSize;			// 整个消息的长度， sizeof(CORE_MSG) +  iBodyLen 
	long long			_channelNO;			// 通道号，服务端专用
	unsigned int		_peerIP;			// 对端主机的IP
	int						_mainCode;			// 主消息码
	int						_subCode;			// 辅助消息码
	CORE_ENCRYPTION		_coreEncryption;	// 加密方式

	CORE_MSG_HEAD()
	{
		_beginFlag = 0xaaaaaaaaaaaaaaaa;
		_cordState = 0;
		_channelNO = INVALID_CHANNEL_NO;	
		_peerIP = 0;	
		_mainCode = INVALID_MAIN_CODE;
		_subCode = INVALID_SUB_CODE;
		_totalSize = sizeof(CORE_MSG_HEAD);
		memset(&_coreEncryption, 0 , sizeof(CORE_ENCRYPTION));
	}

	// 在原长度基础上增加长度
	void RaiseTotalSize(const int& iRaiseSize){_totalSize += iRaiseSize;}

	// 设置成心跳包
	void set_heartbeat()  	{	_cordState = _cordState | 0x00000001;		}
};

	#ifdef WIN32
		#pragma pack(pop)
	#else
		#pragma pack()
	#endif

#endif